\documentclass[4pt, a4paper, spanish]{article}
\usepackage[spanish]{babel}
\usepackage[cm]{fullpage}
%\usepackage[top=2in, bottom=1.5in, left=1in, right=1in]{geometry}
\usepackage{graphicx} %para incluir graficos
\thispagestyle{empty}
\pagestyle{empty}
\usepackage[margin=1in]{geometry}
\begin{document}

\section{Historia \& Cronolog\'ia}
	\begin{center}
	    \begin{tabular}{ | l | l | l | l |}
		    \hline
			    Microprocesador & A\~no & $\mu$Arquitectura & Datos Relevantes\\ \hline
			    8086 & 1978  & 8086 & Primer procesador x86 (16 bits) \\ \hline
			    8088 & 1979 & 8086 & Bus externo de 8bits en vez de 16bits\\ \hline
			    Intel286 & 1982 & 286 & Introduce Modo Protegio y multitasking \\ \hline
			    Intel386 & 1985 & i386 & Extiende la ISA a 32 bits \\ \hline
			    Intel486 & 1989 & i486 & Incluye FPU interna y Pipelinning \\ \hline
			    Intel Pentium & 1993 & P5 & Introduce microarquitectura Superscalar \\ \hline
			    Intel Pentium Pro & 1995 & P6 & Introduce PAE, Speculative \& Dynamic execution  \\ \hline
			    Intel Pentium MMX & 1997 & P55C (P5) & Introduce instrucciones MMX (SIMD) \\ \hline
			    Intel Pentium II & 1997  & P6 & Semejante al Pentium Pro (mejor rendimiento y MMX) \\ \hline
			    Intel Pentium III & 1999 & P6 & Introduce SSE Instruction Set \\ \hline
			    Intel Pentium 4 & 2000 & NetBurst & SSE2\textbackslash{3}. Hyper-threading (2003). Extiende a x86\_64 (2004)  \\ \hline
			    Intel Itanium & 2001 & P7 & Arquitectura IA-64 (Distinta de x86\_64\textbackslash{}IA-32e) \\ \hline
			    Intel Itanium 2 & 2002 & P7 & Mejora de Performance con respecto a Itanium  \\ \hline
			    Intel Pentium D & 2005 & NetBurst & SSE2\textbackslash{3}, Hyper-threading, x86\_64, Introduce 2 cores \\ \hline
			    Intel Core 2 & 2006 & Core & 1 (Solo) 2 (Duo) o 4 (Quad) cores, SSSE3\textbackslash{4.1} \\ \hline
			    Intel Corei3\textbackslash{5}\textbackslash{7} & 2007 & Nehalem & Reintroduce Hyper-Threading, SSE4.2 \\	    			    
		    \hline
	    \end{tabular}
	\end{center}
La tabla s\'olo muestra los detalles mas importantes de los microprocesadores, en particular las tecnolog\'ias que introducen, ordenados por a\~no de lanzamiento. No est\'an todos enumerados, y hay que tener en cuenta que varios modelos fueron fabricados simultaneamente: \\ 
Familia P6 (1995-1999), Pentium 4 (2000-2006), Pentium M (2003-2008), Pentium D\textbackslash{Extreme Edition} (2005-2007). Tambi\'en 
se obviaron detalles de velocidades del clock, tama\~nos de caches, tama\~no y cantidad de transistores. Previo al 8086, Intel habia lanzado el 8008 (1972) de 8bits y el 4004 (1971) de 4bits. \\

%============================================================================================================================

\section{Modos de Procesamiento}
\noindent \underline{Legacy Modes:}
	\begin{itemize}
	  \item Modo Real: Implementa entorno de operacion del 8086. 1Mbyte de memoria f\'isica direccionable, Operandos de 16 o 32 bits (Registros tambi\'en). Paginaci\'on no est\'a soportada y todo el c\'odigo corre con Privilige Level 0. El procesador siempre arranca en este modo.
	  \item Modo Protegido: Soporte para memoria virtual (Paginaci\'on), memoria fisica direccionable a 4Gb, extensible con PAE (Depende del modelo cuanto se extiende). Se habilita la traduccion de segmento, proteccion de segmento y multitasking. Paginaci\'on puede ser habilitada opcinalmente. El software puede correr con Privilige Level (De mayor a menor privilegio) 0, 1, 2 o 3. 
	  \item Modo Virtual-8086: Permite correr software de modo real de 16 bits en un procesador 8086 virtualizado. Este modo no puede ser habilitado en 64 bits.
	  \item Modo Mantenimiento de Sistema: Modo designado para actividades de control de sistema, entre ellos uso de energia. Lo utiliza principalmente la BIOS y drivers de dispositivos de bajo nivel.  Se entra en este modo a trave\'ez de una interrupci\'on de mantenimiento de sistema (SMI), se resguarda el contexto de forma acutom\'atica y se ejecuta en un espacio separado.
	\end{itemize}
\underline{IA-32e (Long Mode en AMD):} 
	\begin{itemize}
	  \item Modo 64 bits: Direcciones virtuales de 64 bits, Extensi\'on de los registros de prop\'osito general (RAX, RBX, etc), 8 Registros nuevos de prop\'osito genral(R8-R15), 8 registros nuevos de SIMD (XMM8-XMM15), RIP de 64 bits, Modelo Flat de Segmentaci\'on. Requiere Paginaci\'on activa, y un sistema operativo de 64 bits. Por default las direcciones son de 64 bits y los operandos de 32 bits. Se introduce el prefijo REX para especificar operandos de 64 bits (se encarga el compilador de assembler). El registro EFLAGS se extiende a 64bits y se pasa a llamar RFLAGS, aunque los nuevos 32 bits superiores son reservados y se leen como ceros. 
	  \item Modo Compatibilidad: Es un submodo del modo 64 bits. Permite al sistema ejecutar c\'odigo de 16 o 32 bits de x86 sin necesidad de recompilaci\'on. En este modo s\'olo se puede acceder a  los primeros 4GBytes de memoria. Desde la perspectiva del programa, corre en modo protegido.
	\end{itemize}	
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/Operating_modes.png}	
	\end{center}	



\underline{Registros Visibles para programar:}
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/registros_64bits_AMD.png}	
	\end{center}

Los Registros FPR0-7 (R0-R7) son los registros de la Floating Point Unit (FPU), de 80bits.
Los MMX0-7 son de 64bits y referencian la parte baja de los FPR. 
Los registros de la FPU a veces son llamados \textit{FPU Register Stack} porque los par\'ametros son pusheados a los registros (con la instrucci\'on FLD y similares) y act\'ua como un stack. 
Tambi\'en se los reconoce como \textit{st0-7} (por ejemplo en el GDB).\\
Por \'ultimo est\'an los registros XMM0-15 de 128 btis. Adicionalmente, \'estos fueron extendidos a 256 bits a registros llamados YMM (En 32bits se puede acceder a YMM0-7).\\

\newpage

	\underline{Usos implicitos de los registros:}
	\begin{itemize}
		\item \textbf{EAX} - Registro Acumulador
		\item \textbf{EBX} - Puntero a Data (Base)
		\item \textbf{ECX} - Contador para strings y loops
		\item \textbf{EDX} - Puntero de Entrada\textbackslash{Salida}
		\item \textbf{ESI} - Puntero al \textit{source} para operaciones de strings
		\item \textbf{EDI} - Puntero al \textit{destiny} para operaciones de strings
		\item \textbf{ESP} - Stack pointer (tope del stack) apunta al \'ultimo valor pusheado (no a una posici\'on libre).
		\item \textbf{EBP} - Base Pointer (base del stack) \\
	\end{itemize}


Estos son los GPR's en 32bits y corresponden a las partes bajas de los registros RAX, RBX, etc. Existen instrucciones que referencias a estos registros de forma impl\'icita, como \textit{PUSH} que (ademas de pushear el dato al stack) decrementa el valor de ESP, o la instrucci\'on \textit{LOOP}, que decrementa ECX y hace un jump condicional.

%============================================================================================================================

\section{Manejo de Memoria}

Primero empecemos con Modo Real. Contamos con los GPR's AX, BX, CX, DX, SI, DI, BP y SP de 16 bits cada uno, y los registros de segmento CS, DS, SS, ES, FS y GS tambi\'en de 16 bits. 
Las direcciones son de la forma A:B, donde A es un registro de segmento y B un GPR. Se obtiene la direcci\'on f\'isica de la sgueinte manera: \\
\begin{center} \textit{Physical address = (A * 0x10) + B}\\ \end{center}
Es decir, se shiftea 4 posiciones A, y B es el offset. Por ejmeplo, si quisieramos obtener la \'ultima direcci\'on f\'isica direccionable (0xFFFFF, ya que direcciona solamente 1Mb),
podr\'iamos referenciarla como 0xF000:0xFFFF. Veamos, 0xF000 * 0x10 = 0xF0000 (si, da un numero que no entra en el registro), luego 0xF0000 + 0xFFFF = 0xFFFFF. Por otro lado, podemos referenciarlo como 0xFF00:0x0FFF.
0xFF00 * 0x10 = 0xFF000, luego al sumar 0xFF000+0x0FFF = 0xFFFFF. Una misma direccion f\'isica puede ser referenciadas de multiplas formas.\\ \\
Los procesadores IA-32 organizan la memoria como una secuencia de bytes, direccionables a traves  ́de su Bus de Address.
La memoria conectada a este bus se denomina \textbf{memoria f\'isica}. 
El espacio de direcciones que pueden volcarse sobre este bus se
denomina \textbf{direcciones f\'isicas}. Las direcciones f\'isicas pueden mapearse a memoria de lectura-escritura (RAM), s\'olo lecutra (ROM), y memoria de I/O (ej: memoria de la placa de video).
	\subsection*{Segmentaci\'on}
Cuando se est\'a en modo protegido, se activa la segmentaci\'on. No hay bit de control para deshabilitarla, pero s\'i se puede hacer que no tenga efecto. Sin paginaci\'on activa, se cuenta s\'olo con direcciones f\'isicas de 32 bits (PAE y PSE extiende las direcciones f\'sicas a travez de paginaci\'on).\\

Una direcci\'on l\'ogica (Direccion expreseda en base a los recursos de la arquitectura) consiste en un selector de segmento (16 bits) y un offset (32 o 64 bits) llamado direcci\'on efectiva.  El selector de segmento es el \'indice en la GDT (Global Descriptor Table) o LDT (Local Descriptor Table), la cual contiene la direcci\'on base, l\'imite y atributos de un segmento. De all\'i se cosntruye la direcci\'on lineal.
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/logica_a_lineal.png}	
	\end{center}
Si paginaci\'on no est\'a activa, la direcci\'on lineal es equivalente a la direcci\'on f\'isica. Sino, la direcci\'on lineal es luego usada por el mecanismo de paginaci\'on.
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/selector_segmento.png}
		Selector de segmento
		
	\end{center}
	\begin{itemize}
		\item \textbf{RPL} (bits 0 y 1): Indica el nivel de privilegio del selector (0 a 3). Ver secci\'on de protecci\'on.
		\item \textbf{TI} (bit 2): Indica si usar la GDT o LDT.
		\item \textbf{Indice} (bit 3 a 15): Indica el \'indice de la tabla. Hay
$ 2^{13}$ = 8192 posibles entradas. La primer entrada de la GDT siempre es NULL por cuestiones de seguridad y detecci\'on de bugs. Si se usa un selector de segmento nulo, al tratar de acceder a la direcci\'on, genera una General Protection Exception. \\

\textbf{\textquestiondown Que hay en la GDT?}\\ 
La GDT contiene descriptores de segmento. Los descriptores son de 8 bytes tanto en 32 como en 64 bits (excepto por el descriptor de sistema, que en 64 bits pasa a ser de 16 bytes, ocupando 2 entradas).
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/descriptor_segmento.png}	
	\end{center}
\textbf{\textquestiondown Que son todos esos campos del descriptor?}\\
\begin{description}

\item \textbf{Segment limit field:} El m\'aximo offset que puede tener un byte direccionable dentro del segmento.\\
\item \textbf{Base Address field:} Direcci\'on a partir de la cual se despliega en forma continua el segmento.\\
\item	\textbf{G flag:} Establece la unidad de medida del campo L\'imite. \\		
	G=0 el m\'aximo offset de un byte es igual a L\'imite. El segmento puede ser de 1 byte a 1 Mb. \\ 
	G=1 el l\'imite se multiplica por 4Kbytes. Los 12 bits menos significativos no se testean contra el offset. Por ejemplo, si el limite es 0 con G=1, se puede acceder desde el byte 0 hasta el 4095 (el m\'aximo offset es igual a \textit{L\'imite * }0x400 +0x3FF).\\
Si el segmento es Expand-Up genera una \#GP si el offset es \textbf{mayor} que el l\'imite. \\
Si el segmento es Expand-Down (Stack) genera una \#GP si el offset es \textbf{menor o igual} que el l\'imite.



\item \textbf{DPL field:} Indica el nivel de privilegio del segmento (De 0 a 3).\\

\item \textbf{P flag:} Indica si el segmento est\'a presente en memoria (P=1) o si no est\'a en memoria (P=0). Si no est\'a presente, se genera una excepci\'on de Segment-Not-Present (\#NP) y el SO se encarga de cargar el segmento. Ofrece otra forma de maneajr memoria virtual adem\'as de paginaci\'on.\\

\item \textbf{AVL flag:} Available. Disponible para el programador, no tiene uso especificado. \\

\item \textbf{L flag:} Indica que el segmento de c\'odigo contiene c\'odigo nativo de 64-bits. L=1 indica que el c\'odigo se ejecuta en modo 64-bits. L=0 se ejecuta en modo compatibilidad. Si L=1 $\Rightarrow$ D=0 (D/B flag). Si no se est\'a en modo IA-32e o si no es un segmento de c\'odigo, se debe setear L=0. \\

\newpage

\item \textbf{D/B flag:}: Default operation size/Default stack pointer size and/Upper bound. Depende del campo \textit{Type} que indica: \\
	\begin{description}
		\item \underline{Segmento de C\'odigo:} El flag se denomina D (Default). D=1 operandos y direcciones de 32-bits se usan por default. D=0 se usan operandos y direcciones de 16-bits. Se pueden usar prefijos para usar otro tama\~no de operando y direcci\'on.
		\item \underline{Segmento de Data Stack (apuntado por SS):} El flag de denomina B (big) e indica el tama\~no del puntero al stack. B=1 usa el registro ESP (32-bits) y las operaciones asociadas (pushes, pops, calls) son de 32-bits. B=0 usa SP (16-bits).
		\item \underline{Segmento de Data Expand-Down:} El flag se denomina B. Si B=1, el l\'mite superior es 0xFFFFFFFF (4 GBytes). Si B=0, el l\'imite superior es 0xFFFF (64 KBytes) (Ver secci\'on del campo \textit{Type}). 
	\end{description}
	
\item \textbf{S flag:} Indica si el descriptor es de dato\textbackslash{c\'odigo} (S=1) o un descriptor de sistema (S=0). Para el caso del descriptor de sistema, en general se refiere a mecanismos de uso de recursos del procesador por parte del kernel.\\

\item \textbf{Type field flags:}\\
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/segment_code_data.png}	
		\begin{center}
			\textbf{Flag S=1. Descriptor de C\'odigo o Data}
		\end{center}
	\end{center}

	\underline{Descriptor de Dato (bit 11=0):}\\
	
	\textbf{E (Expansion Direction):}
	\begin{description}
		\item E=0 Expand-Up: Las direcciones v\'alidas van desde \textit{Base Address} hasta \textit{Base Addres + Limit}.
		\item E=1 Expand-Down: Las direcciones v\'alidas van desde \textit{Limit +1 } hasta \textit{0xFFFFFFFF} (Flag B=1) o \textit{0xFFFF} (Flag B=0). Las direcciones entre \textit{Base Address} y \textit{Base Addres + Limit} son inv\'alidas.
	\end{description}		
	\textbf{W (Writable):} Indica si se puede escribir en el segmento (siempre se puede leer un segmento de Dato).\\	
	\textbf{A (Accesed):} Indica si el segmento fue accedido desde la \'ultima vez que el sistema operativo puso en 0 el bit A. El procesador lo setea en 1 cada vez que accede.\\
	
	\underline{ Desriptor de C\'odigo (bit 11=1): }\\
	
	\textbf{C (Conforming):} 
		\begin{description}		
		\item C=1 Conforming: El c\'odigo de este segmento puede ser ejecutado desde un nivel de privilegio menor o igual. Ejemplo: c\'odigo con nivel de privilegio 3 puede hacer un far-jump a un segmento con nivel de privilegio 2, 1 o 0. C\'odigo con nivel de privilegio 0 no puede hacer un jump-far a un segmento con privilegio distinto de cero (Pensarlo como si fuera una syscall, un programa con poco privilegio puede ejecutar c\'odigo con mucho privilegio, pero la vuelta no vale). 
		\item C=0 Non-Conforming: S\'olo se puede ejecutar c\'odigo en el mismo nivel de privilegio.
			\end{description}
% Teorica furfaro:
%Estos segmentos de c\'odigo ajustan su nivel de privilegio al del c\'odigo que los ha invocado.
%Permiten que un segmento de c\'odigo pueda ser invocado desde otro segmento de c\'odigo menos privilegiado mediante por
%ejemplo un CALL a una subrutina residente en este segmento. Sin embargo el c\'odigo privilegiado ajustar\'a su nivel de privilegio al del segmento de c\'odigo invocante.\\	
	\textbf{R (Readable):} Indica si se puede leer el segmento, generalmente usado para leer constantes en el segmento. (nunca se puede escribir en un segmento de c\'odigo).\\	
	\textbf{A (Accesed):} Indica si el segmento fue accedido desde la \'ultima vez que el sistema operativo puso en 0 el bit A. El procesador lo setea en 1 cada vez que accede.\\ \\
	
	\textbf{Descriptor de Segmento de Sistema:}
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/segment_system.png}
		\begin{center}
			\textbf{Flag S=0. Descriptor de Sistema}
		\end{center}
	\end{center}

\end{description}

\textbf{\textquestiondown Como sabe el SO donde est\'a la GDT y la LDT?}\\ 
Se carga la direcci\'on lineal (Sin paginaci\'on lineal==f\'isica) en registros dedicados GDTR y LDTR.
Contiene la Base Address (En modo protegido 32-bits, en IA-32e 64-bits) y el l\'imite de 16-bits que indica la cantidad de bytes que posee la tabla. La Base addres apunta al primer byte de la tabla. Se usan las instrucciones LGDT y LLDT respectivamente para cargar la direcci\'on y l\'imite. El l\'imite permite exactamente que haya $2^{13} * 8 bytes$ en la tabla, exactamente la cantidad total posible de descriptores de segmento ($2^{13}$) que ocupan 8 bytes, o 16 bytes para el caso de descriptores de sistema en IA-32e.
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/GDTR_LDTR.png}
	\end{center}

\textbf{Entonces, \textquestiondown Como se traduce una direcc\'on l\'ogica a una lineal?}\\ 
La direcc\'on l\'ogica est\'a compuesta por un selector de segmento y un offset. Del selector de segmento se utiliza el flag TI para saber si usar la GDT o la LDT. Toma el
\underline{Caso GDT:}
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/logica_segmentacion_lineal.png}
	\end{center}
\underline{Caso LDT:}
% Agregar el descriptor de GDT y LDT, y el camino de Logica->Lineal. Para que esta la LDT

% Agregar los modelos de segmentacion
		\end{itemize}
	\subsection*{Paginaci\'on}
La Paginaci\'on es obligatoria en modo de 64 bits.	
	\begin{center}
		\includegraphics[width=15.0cm]{graficos/segmentacionypagicacion.png}	
	\end{center}

%============================================================================================================================

\section{Protecci\'on}

%============================================================================================================================

\section{Interrupciones \& Excepciones}

%============================================================================================================================

\section{Tasks}

%============================================================================================================================

\section{Memoria Cache}

%============================================================================================================================






\end{document}
			



			% Incluir un grafico
			% \begin{figure}[htp] 
			%    \centering 
			%    \includegraphics[width=11.0cm,height=9.0cm]{graficos/Transistor_Count_bar_chart.jpg} 
			%    \caption{Comparación de tiempo de ejecución real del algoritmo y el tiempo teórico calculado}
			%  \end{figure}  